!function(w){
	if(!w.validate){
		var validate = w.validate = {
			_init : false,
			_template : '<label class="icon notification" style="color:#F39C12;width:auto"></label>',
			error : null
		};
	}

	var self = validate;

	validate.validate = function(frmId){
		var result = true;
		var allInput = $('#' + frmId + ' input,#' + frmId + ' select,#' + frmId + ' textarea');
		var len = allInput.length;
		var j = 0;
		for ( var i = 0; i < len; i++) {
			var inpx = $(allInput.get(i));
			var validateFlag = self.validateInput(inpx);
			if (validateFlag == false && j == 0) {
				result = validateFlag;
				j++;
			}
		}
		return result;
	},

	validate.validateInput = function(inpx){
		var inpClass = inpx.attr('class');
		if (inpClass != null && inpClass.indexOf('validate[') > -1) {
			var indexBegin = inpClass.indexOf('validate[') + 9;
			var indexEnd = indexBegin + 1;
			var endFlag = 1;
			while (true) {
				var oneChar = inpClass.substring(indexEnd, indexEnd + 1);
				if ('[' == oneChar) {
					endFlag++;
				} else if (']' == oneChar) {
					endFlag--;
				}
				if (endFlag == 0) {
					break;
				}
				indexEnd++;
				if (indexEnd > 500) {
					alert('验证语法错误');
					return false;
				}
			}
			var validateStr = inpClass.substring(indexBegin, indexEnd);
			var validateGroup = validateStr.split(',');
			var groupLen = validateGroup.length;
			var type = inpx.attr('type');
			if ('text' == type) {
				for ( var j = 0; j < groupLen; j++) {
					var validateType = validateGroup[j];
					if ('require' == validateType) {
						if ('' == inpx.val() || inpx.val() == null) {
							self.addValidateClass(inpx, '不能为空');
							return false;
						}
					} else if ('integer' == validateType) {
						var ptn = /^(\+|-)?\d+$/;
						if ('' != inpx.val() && !ptn.exec(inpx.val())) {
							self.addValidateClass(inpx, '必须为整数');
							return false;
						}
					} else if ('number' == validateType) {
						var ptn = /^(\+|-)?\d+($|\.\d+$)/;
						if ('' != inpx.val() && !ptn.exec(inpx.val())) {
							self.addValidateClass(inpx, '必须为数字');
							return false;
						}
					} else if ('plus' == validateType) {
						var ptn = /^(\+)?\d+($|\.\d+$)/;
						if ('' != inpx.val() && (!ptn.exec(inpx.val()) || parseFloat(inpx.val()) == 0.00)) {
							self.addValidateClass(inpx, '必须为正数');
							return false;
						}
					} else if ('plus&0' == validateType) {
						var ptn = /^(\+)?\d+($|\.\d+$)/;
						if ('' != inpx.val() && !ptn.exec(inpx.val())) {
							self.addValidateClass(inpx, '必须为非负数');
							return false;
						}
					} else if ('negative' == validateType) {
						var ptn = /^\-\d+($|\.\d+$)/;
						if ('' != inpx.val() && (!ptn.exec(inpx.val()) || parseFloat(inpx.val()) == 0.00)) {
							self.addValidateClass(inpx, '必须为负数');
							return false;
						}
					} else if ('negative&0' == validateType) {
						var ptn = /^\-\d+($|\.\d+$)/;
						if ('' != inpx.val() && !ptn.exec(inpx.val()) && parseFloat(inpx.val()) != 0.00) {
							self.addValidateClass(inpx, '必须为非正数');
							return false;
						}
					} else if (validateType.indexOf('expression=') > -1) {
						if ('' != inpx.val()) {
							var expression = validateType.substring(validateType
									.indexOf('=') + 1, validateType.length);
							if (!eval(expression).exec(inpx.val())) {
								self.addValidateClass(inpx, '格式不正确');
								return false;
							}
						}
					} else if (validateType.indexOf('maxlength=') > -1) {
						var maxlength = parseInt(validateType.split('=')[1]);
						var inpLen = inpx.val().length;
						if (inpLen > maxlength) {
							self.addValidateClass(inpx, '长度不能超过' + maxlength + '个字符');
							return false;
						}
					} else if (validateType.indexOf('minlength=') > -1) {
						var minlength = parseInt(validateType.split('=')[1]);
						var inpLen = inpx.val().length;
						if (inpLen < minlength) {
							self.addValidateClass(inpx, '长度不能小于' + minlength + '个字符');
							return false;
						}
					} else if (validateType.indexOf('equals=') > -1) {
						var compareId = validateType.split('=')[1];
						var compareObj = $('#' + compareId);
						if (inpx.val() != compareObj.val()) {
							self.addValidateClass(inpx, '不等于' + compareObj
									.attr('label') + '');
							return false;
						}
					} else if (validateType.indexOf('ajax=') > -1) {
						var ajaxParam = validateType.split('=')[1];
						var func = '';
						if (ajaxParam.indexOf('(') == -1)
							func = '()';
						var paramObj = eval(ajaxParam + func);
						var url = paramObj.url;
						var params = paramObj.params;
						var returnResult = '';
						ajaxAsync(url, 'post', params, true, function(data){
							returnResult = data;
						});
						if(returnResult != null && '' != returnResult)
						{
							self.addValidateClass(inpx, returnResult);
							return false;
						}
					} else if (validateType.indexOf('func=') > -1) {
						var func = validateType.split('=')[1];
						var ff = '()';
						if(func.indexOf('(') > -1)
							ff = '';
						var funcResult = eval(func + ff);
						if(isNotNull(funcResult))
						{
							self.addValidateClass(inpx, funcResult);
							return false;
						}
					}
				}
			} else if ('password' == type) {
				for ( var j = 0; j < groupLen; j++) {
					var validateType = validateGroup[j];
					if ('require' == validateType) {
						if ('' == inpx.val() || inpx.val() == null) {
							self.addValidateClass(inpx, '不能为空');
							return false;
						}
					} else if (validateType.indexOf('expression=') > -1) {
						if ('' != inpx.val()) {
							var expression = validateType.substring(validateType
									.indexOf('=') + 1, validateType.length);
							if (!eval(expression).exec(inpx.val())) {
								self.addValidateClass(inpx, '格式不正确');
								return false;
							}
						}
					} else if (validateType.indexOf('maxlength=') > -1) {
						var maxlength = parseInt(validateType.split('=')[1]);
						var inpLen = inpx.val().length;
						if (inpLen > maxlength) {
							self.addValidateClass(inpx, '长度不能超过' + maxlength + '个字符');
							return false;
						}
					} else if (validateType.indexOf('minlength=') > -1) {
						var minlength = parseInt(validateType.split('=')[1]);
						var inpLen = inpx.val().length;
						if (inpLen < minlength) {
							self.addValidateClass(inpx, '长度不能小于' + minlength + '个字符');
							return false;
						}
					} else if (validateType.indexOf('equals=') > -1) {
						var compareId = validateType.split('=')[1];
						var compareObj = $('#' + compareId);
						if (inpx.val() != compareObj.val()) {
							self.addValidateClass(inpx, '不等于' + compareObj
									.attr('label') + '');
							return false;
						}
					} else if (validateType.indexOf('ajax=') > -1) {
						var ajaxParam = validateType.split('=')[1];
						var func = '';
						if (ajaxParam.indexOf('(') == -1)
							func = '()';
						var paramObj = eval(ajaxParam + func);
						var url = paramObj.url;
						var params = paramObj.params;
						var returnResult = '';
						ajaxAsync(url, 'post', params, true, function(data){
							returnResult = data;
						});
						if(returnResult != null && '' != returnResult)
						{
							self.addValidateClass(inpx, returnResult);
							return false;
						}
					} else if (validateType.indexOf('func=') > -1) {
						var func = validateType.split('=')[1];
						var ff = '()';
						if(func.indexOf('(') > -1)
							ff = '';
						var funcResult = eval(func + ff);
						if(isNotNull(funcResult))
						{
							self.addValidateClass(inpx, funcResult);
							return false;
						}
					}
				}
			} else if ('select-one' == type || 'select' == type) {
				for ( var j = 0; j < groupLen; j++) {
					var validateType = validateGroup[j];
					if ('require' == validateType) {
						if ('' == inpx.val() || inpx.val() == null) {
							self.addValidateClass(inpx, '不能为空');
							return false;
						}
					} else if (validateType.indexOf('func=') > -1) {
						var func = validateType.split('=')[1];
						var ff = '()';
						if(func.indexOf('(') > -1)
							ff = '';
						var funcResult = eval(func + ff);
						if(isNotNull(funcResult))
						{
							self.addValidateClass(inpx, funcResult);
							return false;
						}
					}
				}
			} else if ('radio' == type) {
				for ( var j = 0; j < groupLen; j++) {
					var validateType = validateGroup[j];
					if ('require' == validateType) {
						var inpName = inpx.attr('name');
						var radios = $('input:radio[name="' + inpName + '"][checked]');
						if (radios.length == 0) {
							self.addValidateClass(inpx, '不能为空');
							return false;
						}
					} else if (validateType.indexOf('func=') > -1) {
						var func = validateType.split('=')[1];
						var ff = '()';
						if(func.indexOf('(') > -1)
							ff = '';
						var funcResult = eval(func + ff);
						if(isNotNull(funcResult))
						{
							self.addValidateClass(inpx, funcResult);
							return false;
						}
					}
				}
			} else if ('checkbox' == type) {
				for ( var j = 0; j < groupLen; j++) {
					var validateType = validateGroup[j];
					if ('require' == validateType) {
						var inpName = inpx.attr('name');
						var checkboxs = $('input:checkbox[name="' + inpName + '"][checked]');
						if (checkboxs.length == 0) {
							self.addValidateClass(inpx, '不能为空');
							return false;
						}
					} else if (validateType.indexOf('func=') > -1) {
						var func = validateType.split('=')[1];
						var ff = '()';
						if(func.indexOf('(') > -1)
							ff = '';
						var funcResult = eval(func + ff);
						if(isNotNull(funcResult))
						{
							self.addValidateClass(inpx, funcResult);
							return false;
						}
					}
				}
			} else if ('textarea' == type) {
				for ( var j = 0; j < groupLen; j++) {
					var validateType = validateGroup[j];
					if ('require' == validateType) {
						if ('' == inpx.val() || inpx.val() == null) {
							self.addValidateClass(inpx, '不能为空');
							return false;
						}
					} else if (validateType.indexOf('maxlength=') > -1) {
						var maxlength = parseInt(validateType.split('=')[1]);
						var inpLen = inpx.val().length;
						if (inpLen > maxlength) {
							self.addValidateClass(inpx, '长度不能超过' + maxlength + '个字符');
							return false;
						}
					} else if (validateType.indexOf('minlength=') > -1) {
						var minlength = parseInt(validateType.split('=')[1]);
						var inpLen = inpx.val().length;
						if (inpLen < minlength) {
							self.addValidateClass(inpx, '长度不能小于' + minlength + '个字符');
							return false;
						}
					} else if (validateType.indexOf('func=') > -1) {
						var func = validateType.split('=')[1];
						var ff = '()';
						if(func.indexOf('(') > -1)
							ff = '';
						var funcResult = eval(func + ff);
						if(isNotNull(funcResult))
						{
							self.addValidateClass(inpx, funcResult);
							return false;
						}
					}
				}
			}
		}
		
		if (inpx.hasClass('inputError')) {
			self.removeValidateClass(inpx);
		}
		return true;
	},

	validate.addValidateClass = function(obj, msg){
		if(!obj.hasClass("inputError")){
			obj.parent("div").addClass("has-error");
			obj.addClass('inputError');
		}
		self.error = obj.data("title") + msg;
	},

	validate.removeValidateClass = function(obj) {
		obj.parent("div").removeClass("has-error");
		if(obj.hasClass('inputError'))
		{
			obj.removeClass('inputError');
		}
	},

	validate.initValidate = function(frmId){
		var allInput = $('#' + frmId + ' input');
		var len = allInput.length;
		for ( var i = 0; i < len; i++) {
			var inpx = $(allInput.get(i));
			self.bindInput(inpx);
		}
	},

	validate.bindInput = function(inpx){
		var inpClass = inpx.attr('class');
		if (inpClass != undefined && inpClass != null && inpClass.indexOf('validate[') > -1) {
			var type = inpx.attr('type');
			if ('text' == type) {
				inpx.bind('blur', function() {
					self.validateInput($(this));
				});
			} else if ('password' == type) {
				inpx.bind('blur', function() {
					self.validateInput($(this));
				});
			} else if ('select-one' == type || 'select' == type) {
				inpx.bind('change', function() {
					self.validateInput($(this));
				});
			} else if ('radio' == type) {
				var name = inpx.attr('name');
				var radios = $('input:radio[name="' + name + '"]');
				var radioLen = radios.length;
				for ( var i = 0; i < radioLen; i++) {
					var rx = $(radios.get(i));
					rx.bind('click', function() {
						self.validateInput(inpx);
					});
				}
			} else if ('checkbox' == type) {
				var name = inpx.attr('name');
				var checkboxs = $('input:checkbox[name="' + name + '"]');
				var checkboxLen = checkboxs.length;
				for ( var i = 0; i < checkboxLen; i++) {
					var cbx = $(checkboxs.get(i));
					cbx.bind('click', function() {
						self.validateInput(inpx);
					});
				}
			} else if ('textarea' == type) {
				inpx.bind('blur', function() {
					self.validateInput($(this));
				});
			}
		}
	};
}(window);
